#ifndef PRODUCT_CONFIG_H
#define PRODUCT_CONFIG_H
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"


#include "system_Config.h"
/****************************通用配置项***********************************/
#define BUF_SIZE 1024
#define EXAMPLE_CHASE_SPEED_MS      10 //休眠时间10ms

#define LED_NUMBER 60 //灯珠的数量
#define LED2_NUMBER 5
#define LEVEL 100 //亮度等级

/*****************分段模式相关****************************/
#define PART_NUM 20
#define PART_BUFF 60 // PART_NUM*3


typedef struct 
{
    u8 len;
    u8 RGB[PART_BUFF];
}PART_INFO_T;

/***************************数据解析相关**********************************/
#define PACKET_HEADER 0xa5

#define MAIN_MODE 0xAAAA0000 //主模式
#define REGISTER 0X00000000 //注册包
#define INQUIRE 0X00000001 //查询指令

#define SCENE_MODE 0XAAAA0006 //场景模式
#define OPEN_CLOSE 0xAAAA0007 //开关机
#define BRIGHNESS_CW 0XAABB0003 //CW亮度
#define LEVEL_CW 0XAABB0002 //CW色温值
#define PART_DATA 0xAA010000 //分段信息
#define MICRO_SENST 0xaa020000 //麦克风灵敏度
#define SPECTRAL_MODE 0XAAAA0001 //麦克风模式子模式
#define DIRE_MODE 0xAACC0000 //方向控制 
#define HIGH_SPEED 0XAADD0000 //高速模式包

typedef enum
{
    NONE_SOURCE=0, //没有源
    UART_SOURCE, //串口源
    TCP_SOURCE, //网络源
    NUM_SOURCE, 
}DATA_SOURCE; //数据源

typedef struct 
{
    DATA_SOURCE source; //数据来源
    u16 len; //待发送数据长度
    u8 *data; //待发送数据内容
}cache_param; //spi口发送数据参数

typedef struct 
{
    u16 length;
    u8 *data;
}PACKET; //解析包的数据


/********************************nvs保存用的编码*******************************************/
#define CUSTOM_NVS_PART_LABEL "custom_nvs"
#define CUSTOM_NVS_PART_NAMESPACE   "storage"


#define APP_STATUS "app_status" //逻辑状态

/***************************************************************************************/
#define CNT_OFFEST 0X0 //总帧数偏移地址
#define FRAME_NUM 0X02 //帧数偏移地址
#define DATA_ADDR 0X03 //数据地址

#define LOGO_DATA 0x0000 //LOGO起始地址
#define MODE1_DATA 0xc000 //模式1起始地址 
#define MODE2_DATA 0x1f000 //模式2起始地址
#define MODE3_DATA 0x35000  //模式3起始地址
#define MODE4_DATA 0x56000  //模式4起始地址
#define MODE5_DATA 0x69000  //模式5起始地址
#define MODE6_DATA 0x71000  //模式6起始地址
#define MODE7_DATA 0x77000  //模式7起始地址
#define MODE8_DATA 0x7f000  //模式8起始地址
#define MODE9_DATA 0x84000  //模式9起始地址
#define MODE10_DATA 0x90000  //模式10起始地址
#define MODE11_DATA 0x99000  //模式11起始地址
#define MODE12_DATA  0xab000 //模式12起始地址

/*********************自定义及场景相关************************************/
typedef struct 
{
    u8 lastssp;
    u8 ssp;
    u8 recssp;
}CUSTOM_SYS; //自定义模式子状态

typedef struct 
{
    u8 light_effect_ssp;
    u8 wait;
    u8 len;
    u8 buf[45];
}LIGHT_EFFECT_T;

typedef enum
{
    EFFECT_ZERO=0,//灯效0 
    EFFECT_FADE, //淡入淡出
    EFFECT_FADE_OUT, //淡出
    EFFECT_FADE_IN, //淡入
    EFFECT_MARQUEE_COUNTER_CLOCKWISE, //跑马逆时针
    EFFECT_MARQUEE_CLOCKWISE, //跑马顺时针
    EFFECT_FLICKER_ALL, //全频闪烁
    EFFECT_FLICKER_SUBSECTION, //分频闪烁
    EFFECT_WATERFALL, //流水向前
    EFFECT_WATERALL_COUNTER, //流水向后
    RAINBOW_REVERSE, //彩虹反向
    RAINBOW_FORWARD, //彩虹灯正向
    EFFECT_ENUM,
}LIGHT_EFFECT_MODE;


typedef struct 
{
    void (*handle)(uint8_t num,uint8_t wait,uint8_t len,uint8_t *buff);
}LIGHT_EFFECT;

/*****************物理触发源******************************/
typedef enum
{
    ACT_NONE, //0
    ACT_KEY=1, //1 按键源
    ACT_ENCODE, //2 编码器源
    ACT_ENUM,
}ACT_SOURCE;


typedef struct 
{
    u8 drvAct; //具体动作
    u8 num;//触发端枚举，比如是1号按键，还是2号按键
    ACT_SOURCE act_source; //触发源
}key_act_param; //按键枚举行

/****************按键切换部分*********************/
typedef enum
{
    OPT_NONE, //0
    OPT_POWER_TURNON, //1 开机操作
    OPT_POWER_TURNOFF, //2 关机操作
    OPT_GO_NEXT, //3 下一个
    OPT_GO_BACK,    //4 上一个
    OPT_GO_ADD, //5 逐级增加
    OPT_GO_ADD_CONTINUE, //6 持续增加
    OPT_GO_REDUCE,//7 逐级减少
    OPT_GO_REDUCE_CONTINUE, //8 持续减少
    OPT_GO_MIC,//9 进入麦克风
    OPT_OUT_MIC,//10 退出麦克风
    OPT_GO_CW, //11 进入CW
    OPT_OUT_CW,//12 退出CW
    OPT_PREE_ADD,//13 按压增加 
    OPT_PREE_REDUCE,//14 按压缉拿少
    OPT_MATCH_NET,//开始配网
    OPT_INVALID,//15 无效操作
    NUM_APP_OPT,
}EM_APP_OPT;

typedef struct 
{
    EM_APP_OPT oepation;
}SYS_OPT_KEY;
/****************************模式切换相关*********************************/
typedef struct
{
    void (*handle)(SYS_OPT_KEY opt);
}light_MODE; //指针函数，用于控制灯带模式切换 

/*应用逻辑部分*/
typedef enum
{
    SSP_NONE, //0号状态
    SSP_POWER_OFF,//1 对应灯带不亮状态
    SSP_LOGO,//2 对应开机状态
    SSP_MODE_SCENE,//3场景模式
    SSP_MODE_MIC, //4麦克风模式
    SSP_MODE_PART, //5分段模式
    SSP_MODE_CUSTOM, //6自定义模式
    SSP_MODE_CW, //7 CW调色模式
    SSP_HIGH_SPEED,//8 高速模式
    NUM_SYS_SSP,//状态枚举值
}EM_SYS_SSP; //系统状态信息

typedef struct 
{
    EM_SYS_SSP lastssp;
    EM_SYS_SSP ssp;
    EM_SYS_SSP recssp;
}ST_SYS;

/******************************场景模式切换*****************************************/
typedef enum
{
    SCENE_ZERO, //0号
    MODE1, //1
    MODE2,//2
    MODE3,//3
    MODE4,//4
    MODE5,//5
    MODE6,//6
    MODE7,//7
    MODE8,//8
    MODE9,//9
    MODE10,//10
    MODE11,//11
    MODE12,//12
    GROUP_MODE1,    //组合场景1
    GROUP_MODE2,    //组合场景2
    GROUP_MODE3,    //组合场景3
    GROUP_MODE4,    //组合场景4
    GROUP_MODE5,    //组合场景5
    GROUP_MODE6,    //组合场景6
    GROUP_MODE7,    //组合场景7
    GROUP_MODE8,    //组合场景8
    GROUP_MODE9,    //组合场景9
    GROUP_MODE10,    //组合场景10
    GROUP_MODE11,    //组合场景11
    GROUP_MODE12,    //组合场景12
    SCENE_MODE_NUM,
}EM_SCENE_SSP;

typedef struct 
{
    char name[15];
    u32 begin_local;
    LIGHT_EFFECT_T sence_config; //场景相关的一些自定义操作
}SCENE_LOACL_DATA;






/************************麦克风相关*****************************************/
typedef enum
{
    MICRO_ENERGY=1, //1 麦克风-能量
    MICRO_PIANO=7,//7 钢琴键
    MICRO_SHINY=11, //11 麦克风-发光的
    NUM_MICRO_SSP,  //12 麦克风状态枚举值
}EM_MICRO_SSP; //麦克风状态信息

typedef struct 
{
  void (*handle)(u8 value);
}MICRO_MODE; //指针函数，用于控制麦克风模式

typedef struct 
{
    EM_MICRO_SSP lastssp;
    EM_MICRO_SSP ssp;
    EM_MICRO_SSP recssp;
}MICRO_SYS;

/*******************CW亮度调节**********************************/
typedef struct 
{
    u8 cw; //黄光
    u8 w;  //白光
    u8 brighness; //亮度 
}CW_BRIGHNESS; //cw 亮度调节
#endif